/*
    npm i typescript -g
    npm i typescript -D
    npm i @babel/preset-typescript -D
    npm i ts-loader -D

    简介:TypeScript是JavaScript的超集(ts代码可以兼容js代码)
    TS是强类型语言，在浏览器环境、node环境中都不支持。

    在项目中只要用到TS，都在项目指定一个TS配置文件:tsconfig.json

    TypeScript 常用的数据类型：string,number,boolean,enum,tuple,Array<>、type[]、any、void

    TypeScript还支持自定义类型
*/


const msg:number=122
const str:string='hello world'
const bol:boolean=false

let list1:string[]=['a','b']
let list2:Array<number>=[1,2]

let list3:any[]=[1,false,'sd',2]
let list4:Array<any>=[1,false,'sd',2]

let list5:object[]=[{}]
let list6:Array<object>=[{}]

let list7:Array<number[]>=[[1],[54]]

//元组
let tuple1:[number,boolean,string]=[2,true,'fa']
let tuple2: [number[], string[], boolean[]]=[[2],['fa'],[true]]

function add(a:number,b:string):void{
    console.log(a);
}
add(1,'2')

function push(a:object[],b:any[]):any[]{
    return [...a,...b]
}
push([{}],['asd'])

function cal(a:number[],...rest: number[]) :number{
    var arr=[...a,...rest]
    var num=0
    arr.map(ele=>num+=ele)
    return num
}
cal([],1,2,3,1,2,3)

//自定义类型(type interface)

interface Good{
    name:string,
    desc:string,
    src:string,
    hot:boolean,
    price: number,
    list?:string[],//?表示非必填
    [propName:string]:any,//允许你添加任意的自定义属性
    shop?:object,
}
const g:Good={
    name:'小米手机',
    desc:'好手机',
    src:'qwe.png' ,
    hot:true,
    price:24,
    list:['s','m','l'],
    cate_zh:'办公用品',
}

type starProps={
    value:number,
    onChange:()=>{}
}
//类型联合
type A=string|number|boolean
const a:A='hello'

//类型交叉
type T1={
    a:string
}
type T2={
    b:number
}
type B=T1&T2
const b:B={
    a:'hello',
    b:1
}

//泛型 
// function handle1(arg:number):number{
//     return arg
// }
// handle1(100)

// function handle2(arg:string):string{
//     return arg
// }
// handle2('hello')
function handle<T>(arg:T):T{
    return arg
}
handle<number>(100)

function swap<T,U>(arg1:T,arg2:U):T{
    return arg1
}
swap<string,string>('a','b')

interface X<T,U>{
    a:T,
    b:T,
    c:U,
    d?:Array<T>
}

const obj:X<string,boolean>={
    a: 'w',
    b: 'qwe',
    c: true,
    d:['dsa']
}
/*
    interface和type的区别？
    interface自定义类型(接口、形状)，这种方式定义的类型可以被继承
    type自定义类型(类型)，这种方式定义的类型，可以进行交叉、联合。
*/
enum Cate{
    office='办公用品',
    car='汽车生活'
}
Cate.office

export {
    msg,
    Good
}